#ifndef __ENCODER_H__
#define __ENCODER_H__
#include "ti_msp_dl_config.h"
#include "stdint.h"
#include <stdbool.h>
#include "ti/driverlib/dl_common.h"
#include "ti/driverlib/dl_i2c.h"

typedef struct {
    I2C_Regs *i2c;
    uint32_t targetAddr;
    uint8_t set_reg;
    uint8_t *buffer;
    uint16_t count;
    uint8_t use_reg_flag;
} I2C_Operation;
I2C_Operation ENCODER_I2C_Operation;
typedef enum
{
    I2C_ENCODER_READ_ALL=0x01,
    I2C_ENCODER_READ_TIM1=0x02,
    I2C_ENCODER_READ_TIM2=0x03,
    I2C_ENCODER_READ_GPIO=0x04,

    I2C_ENCODER_RW_LED_SWITCH=0x05,
    I2C_ENCODER_RW_GPIO_STATION=0x06,
    I2C_ENCODER_RW_GPIO_SET_OUTPUT=0x07
}I2C_RW_REG;

typedef struct
{
     I2C_Operation op; //I2C结构体
     I2C_RW_REG Set_rw_reg;
     uint8_t  TIM_reg[10];  //TIM1_H TIM1_L TIM2_H TIM2_L  TIM1_circle  TIM2_circle 
     uint8_t  TIM1_reg[3];
     uint8_t  TIM2_reg[4];
     uint16_t TIM_ALL[2];//用于保存 TIM1 TIM2的数据转换成有正负值的形式
     uint8_t Set_LED_Reg[2]; //0保存发送数据 1表示接收数据 用于对比
     uint8_t Set_LED;
     uint8_t Set_GPIO_Station[2];
     uint8_t Set_GPIO_OUTPUT[2];
     uint8_t Read_GPIO_Stat;
}I2C_ENCODER_REG;



// 返回值说明
#define I2C_SUCCESS             0
#define I2C_ERR_NO_ACK         -1
#define I2C_ERR_ARBITRATION    -2
#define I2C_ERR_TIMEOUT        -3
#define I2C_ERR_SCL_LOW        -4

extern I2C_ENCODER_REG enctest;
extern int16_t ENA, ENB;
extern uint8_t *p ; 
extern long long ENA_all , ENB_all;

void Init_I2c_Encoder_Reg(I2C_ENCODER_REG *reg,I2C_Regs *i2c,uint32_t targetAddr);
uint8_t *Read_TIM1(I2C_ENCODER_REG * reg); //读取编码器TIM1的数据，同时会清空编码器模块中的TIM1的计数寄存器 返回为数组指针 TIM1_H TIM1_L TIM1_circle
uint8_t *Read_TIM2(I2C_ENCODER_REG * reg) ; //读取编码器TIM1的数据，同时会清空编码器模块中的TIM1的计数寄存器 返回为数组指针 TIM2_H TIM2_L TIM2_circle 
uint8_t *Read_TIM_ALL(I2C_ENCODER_REG * reg); //同上返回为数组指针  TIM1_H TIM1_L TIM2_H TIM2_L  TIM1_circle  TIM2_circle 
int16_t Get_TIM1(I2C_ENCODER_REG *reg); //返回为int16 直接读无需关心数组指针 舍弃了circle 数据，你大概率用不上
int16_t Get_TIM2(I2C_ENCODER_REG *reg); //返回为int16 直接读无需关心数组指针
int16_t *Get_TIM_ALL(I2C_ENCODER_REG *reg);   //返回为 TIM1 TIM2 int16 的数组指针 0 为TIM1 1为TIM2 请注意！
uint8_t Set_LED_Reg(I2C_ENCODER_REG *reg); //返回值为设置过的寄存器数据从模块中读取的 可以写一个判断看看设置的对不对 为设置LED寄存器 默认0x80 1为开启 0为关闭
uint8_t Set_GPIO_Station(I2C_ENCODER_REG *reg,uint8_t i);//返回值同上 设置GPIO输入输出状态 uint8 每一位2进制代表 一个GPIO详情看上面 
uint8_t Set_GPIO_OUTPUT(I2C_ENCODER_REG *reg,uint8_t i);//返回值同上  设置GPIO 输出状态，先设置输入输出状态 如果为输入状态的话，配置这个无效
uint8_t Read_GPIO_Station(I2C_ENCODER_REG *reg);//获取GPIO 同样为 uint 8返回值同上



int8_t I2C_Receive_Poll(I2C_Operation *op);
int8_t I2C_Read_Poll(I2C_Operation *op);
int8_t I2C_Send_Poll(I2C_Operation *op);
//旧的函数声明
int8_t Backup_I2C_Send_Poll(I2C_Regs *i2c,uint32_t targetAddr,uint8_t set_reg,uint8_t *buffer,uint16_t count,int8_t use_reg_flag);
int8_t Backup_I2C_Read_Poll(I2C_Regs *i2c,uint32_t targetAddr,uint8_t *buffer,uint16_t count);
int8_t Backup_I2C_Receive_Poll(I2C_Regs *i2c,uint32_t targetAddr,uint8_t set_reg,uint8_t *buffer,uint16_t count);
void encoder_proc(void);
#endif  